﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using Golos.Polls.PollCache;
using Golos.Web.Utils;

namespace Golos.Web.handlers
{
    public class AddPollHandler : HandlerBase
    {
        public AddPollHandler(HttpContext httpContext)
            : base(httpContext)
        {
        }
        public override void Handle()
        {
            try
            {
                Token token = TokenUtils.FromCookies(_httpContext.Request.Cookies);

                string qTitle = GetQueryParam("qtitle");
                if (qTitle == "")
                {
                    LogClass.WriteWarningEntry("User:" + token.User + " попытка создания опроса опроса без темы. ");
                    _httpContext.Response.Write("{ \"error\": \"Опрос не создан. Необходимо заполнить тему вопроса.\" }");
                    return;
                }

                Regex filter = new Regex(@"^[a-zA-Zа-яА-Я,-;:?]+$", RegexOptions.Singleline | RegexOptions.Compiled);
                
                if (!filter.IsMatch(qTitle))
                {
                    LogClass.WriteWarningEntry("User:" + token.User + " попытка ввода некорректных символов в теме опроса. " + qTitle);
                    _httpContext.Response.Write("{ \"error\": \"Опрос не создан. Некорректные символы в теме опроса.\" }");
                    return;
                }
                else
                {
                    LogClass.WriteDebugEntry("{0} is match {1}", qTitle, filter.ToString());
                }
                
                int n = Int32.Parse(GetQueryParam("n"));

                if (n < 2)
                {
                    LogClass.WriteWarningEntry("User:" + token.User + " попытка создания опроса меньше чем с 2 ответами. " + n);
                    _httpContext.Response.Write("{ \"error\": \"Опрос не создан. Должно быть минимум 2 варианта ответов.\" }");
                    return;
                }

                if (n > 8)
                {
                    LogClass.WriteWarningEntry("User:" + token.User + " попытка создания опроса больше чем с 8 ответами. " + n);
                    _httpContext.Response.Write("{ \"error\": \"Опрос не создан. Должно быть максимум 8 вариантов ответов.\" }");
                    return;
                }

                string[] tags = GetQueryParam("tags").Split(new char[] {';'}, StringSplitOptions.RemoveEmptyEntries);

                List<string> tagsList = new List<string>();

                foreach (string tag in tags)
                {
                    if (!filter.IsMatch(tag))
                    {
                        LogClass.WriteWarningEntry("User:" + token.User + " попытка ввода некорректных символов в одном из тэгов. " + tag);
                        _httpContext.Response.Write("{ \"error\": \"Опрос не создан. Некорректные символы в тэгах.\" }");
                        continue;
                    } 
                    if (!tagsList.Contains(tag))
                    {
                        tagsList.Add(tag);
                    }
                }
                

                List<Answer> answers = new List<Answer>();

                for (int i = 1; i <= n; i++)
                {
                    if (!filter.IsMatch(GetQueryParam("a" + i)))
                    {
                        LogClass.WriteWarningEntry("User:" + token.User + " попытка ввода некорректных символов в одном из ответов. " + GetQueryParam("a" + i));
                        _httpContext.Response.Write("{ \"error\": \"Опрос не создан. Некорректные символы в одном из ответов.\" }");
                        return;
                    } 
                    Answer ans = new Answer(Guid.NewGuid(), GetQueryParam("a" + i), i);
                    answers.Add(ans);
                }

                PollInfo poll = null;

                if (GetQueryParam("enddate") != "")
                {
                    DateTime enddate = DateTime.ParseExact(GetQueryParam("enddate"), "dd/MM/yyyy", null);
                    poll = new PollInfo(token.User, enddate, qTitle, answers);
                }
                else
                {
                    poll = new PollInfo(token.User, qTitle, answers);
                }
                
                
                if (PollsClient.CreatePoll(poll))
                {
                    if (tagsList.Count > 0)
                    {
                        TagsClient.AddNewTag(poll.Id, tagsList);    
                    }
                    LogClass.WriteInfoEntry("User: " + token.User + " Создан новой опрос " + poll.Id);
                    
                    string json = "{" + PollsHelper.GetPollInfo(poll.Id).TrimEnd(new char[] {',', ' '}) + "}";
                    _httpContext.Response.Write(json);
                }
                else
                {
                    _httpContext.Response.Write("{ \"error\": \"Опрос не создан.\" }");
                }
            }
            catch (Exception e)
            {
                LogClass.WriteErrorEntry(e.ToString());
                _httpContext.Response.Write("{ \"error\": \"Опрос не создан.\" }");
            }
        }
    }
}